1. merge

La función merge permite unir 2 bases de datos usando una o un grupo de columnas (variables) como identificador de cada fila (observación).

1.1. Argumentos de la funcion

x, y = dataframes u objetos a unir.

by, by.x, by.y  = columnas que vamos a usar como identificador para hacer el merge.

all, all.x , all.y = indica que observaciones se quieren mantener el objetos despues de hacer merge.    

suffixes = cadena de caracteres con un subindice para las columnas que se repiten en las dos bases.

1.2. Veamos un ejemplo

Supongamos que tenemos 2 dataframes llamados A y B, que contiene la siguiente información:

1.2.1 Observaciones que hacen match

Si no empleamos ninguno de los argumentos all de la función, R asume que all=F y va a conservar las observaciones que hacen match en las dos bases de datos.

merge(x = A,y = B,by="name")
##    name id.x age id.y wage
## 1 Ariel 1201  15 1201 1000
## 2  Beto 1202  20 1202 1500
## 3  Juan 1203  30 1203 2000

Como tenemos dos variables que sirven como identificador en las dos bases de datos, R genera un identificador para cada una de las variables en la base de datos.

merge(x=A,y=B,by=c("name","id"))
##    name   id age wage
## 1 Ariel 1201  15 1000
## 2  Beto 1202  20 1500
## 3  Juan 1203  30 2000

1.2.2 Todas las observaciones

Cuando agregamos la opción all=T, R va a conservar todas las observaciones en las dos bases de datos y va rellenar con NA las observaciones para las que no hay información en las dos bases de datos.

merge(x=A,y=B,by=c("name","id"),all=T)
##    name   id age wage
## 1 Ariel 1201  15 1000
## 2  Beto 1202  20 1500
## 3  Juan 1203  30 2000
## 4 Pedro 1204  40   NA
## 5  Sofi 1205  50   NA
## 6  Lili 1206  NA 2500
## 7  Vane 1207  NA 3000

1.2.3 Todas las observaciones de A

Cuando agregamos la opción all.x=T, R va a conservar todas las observaciones de A y va rellenar con NA las columnas de B para las que no hay información de A.

merge(x=A,y=B,by=c("name","id"),all.x=T)
##    name   id age wage
## 1 Ariel 1201  15 1000
## 2  Beto 1202  20 1500
## 3  Juan 1203  30 2000
## 4 Pedro 1204  40   NA
## 5  Sofi 1205  50   NA

1.2.4 Todas las observaciones de B

Cuando agregamos la opción all.x=T, R va a conservar todas las observaciones de B y va rellenar con NA las columnas de A para las que no hay información de B.

merge(x=A,y=B,by=c("name","id"),all.y=T)
##    name   id age wage
## 1 Ariel 1201  15 1000
## 2  Beto 1202  20 1500
## 3  Juan 1203  30 2000
## 4  Lili 1206  NA 2500
## 5  Vane 1207  NA 3000

1.3 Hacer merge de 2 bases de datos sin un ID unico

Supongamos que tenemos dos dataframe (data_1 y data_2) que contienen información para tres individuos en diferentes periodos de tiempo. En data_1 se puede observar a cada individuo en tres periodos de tiempo. En data_2 solo observamos a los individuos dos periodos de tiempo.

data_1
##   id month wage
## 1  1     1  927
## 2  1     2 1058
## 3  1     3 1055
## 4  2     1  841
## 5  2     2 1043
## 6  2     3 1211
## 7  3     1 1171
## 8  3     2  883
## 9  3     3  815
data_2
##   id date expenditure
## 1  1    1         587
## 2  1    2         528
## 3  2    1         444
## 4  2    2         553
## 5  3    1         496
## 6  3    2         532

Si se queremos unir a data_1 y data_2 en un dataframe (data_3), deberíamos obtener máximo 9 observaciones. Sin embargo, si omitimos la variable de tiempo, pasa esto:

data_3 = merge(x = data_1,y = data_2,by = 'id')
data_3
##    id month wage date expenditure
## 1   1     1  927    1         587
## 2   1     1  927    2         528
## 3   1     2 1058    1         587
## 4   1     2 1058    2         528
## 5   1     3 1055    1         587
## 6   1     3 1055    2         528
## 7   2     1  841    1         444
## 8   2     1  841    2         553
## 9   2     2 1043    1         444
## 10  2     2 1043    2         553
## 11  2     3 1211    1         444
## 12  2     3 1211    2         553
## 13  3     1 1171    1         496
## 14  3     1 1171    2         532
## 15  3     2  883    1         496
## 16  3     2  883    2         532
## 17  3     3  815    1         496
## 18  3     3  815    2         532

Se duplicaron las observaciones de data_1 y hay 18 observaciones, todos los month se repiten para cada date. Ahora debemos buscar la variable

# Veamos los duplicados por id y month en date_1
paste0(data_1$id,data_1$month) %>% duplicated() %>% table()
## .
## FALSE 
##     9
# Veamos los duplicados por id y date en date_2
paste0(data_2$id, data_2$date) %>% duplicated() %>% table()
## .
## FALSE 
##     6

Ahora hagamos el merge usando la variable de tiempo y el id del usuario

data_4 = merge(x = data_1 , y = data_2 , by.x = c('id','month') ,by.y = c('id','date') , all.x = T)
data_4
##   id month wage expenditure
## 1  1     1  927         587
## 2  1     2 1058         528
## 3  1     3 1055          NA
## 4  2     1  841         444
## 5  2     2 1043         553
## 6  2     3 1211          NA
## 7  3     1 1171         496
## 8  3     2  883         532
## 9  3     3  815          NA

2. rbind.fill

La función rbind.fill pertenece al paquete plyr. Se usa para agregar observaciones a un dataframe usando el nombre de las variables (columnas) y llenando con NA las columnas que están ausentes en uno de los dos dataframes. Sigamos con el ejemplo de la base de datos data_1 y data_2.

plyr::rbind.fill(data_1 , data_2)
##    id month wage date expenditure
## 1   1     1  927   NA          NA
## 2   1     2 1058   NA          NA
## 3   1     3 1055   NA          NA
## 4   2     1  841   NA          NA
## 5   2     2 1043   NA          NA
## 6   2     3 1211   NA          NA
## 7   3     1 1171   NA          NA
## 8   3     2  883   NA          NA
## 9   3     3  815   NA          NA
## 10  1    NA   NA    1         587
## 11  1    NA   NA    2         528
## 12  2    NA   NA    1         444
## 13  2    NA   NA    2         553
## 14  3    NA   NA    1         496
## 15  3    NA   NA    2         532